package com.matrix.framework.core.listcrud.service;

import com.matrix.framework.core.common.global.Pager;
import com.matrix.framework.core.listcrud.data.BaseData;

import java.util.List;
import java.util.Optional;
import java.util.function.Predicate;

/**
 * 基于List的增删改查服务接口
 * 提供类似数据库操作的List操作功能
 *
 * Copyright © 海平面工作室 版权所有
 *
 * @param <T> 数据类型，必须继承BaseData
 * @Author: Leo
 * @Create: 2025/9/20 11:00
 * @Since 1.2
 */
public interface IListCrudService<T extends BaseData> {
    
    /**
     * 保存数据（新增或更新）
     * 如果ID为null或者在列表中不存在，则新增；否则更新
     * 
     * @param entity 要保存的实体
     * @return 保存后的实体
     */
    T save(T entity);
    
    /**
     * 批量保存数据
     * 
     * @param entities 要保存的实体列表
     * @return 保存后的实体列表
     */
    List<T> saveAll(List<T> entities);
    
    /**
     * 根据ID删除数据
     * 
     * @param id 要删除的数据ID
     * @return 是否删除成功
     */
    boolean deleteById(Long id);
    
    /**
     * 删除指定实体
     * 
     * @param entity 要删除的实体
     * @return 是否删除成功
     */
    boolean delete(T entity);
    
    /**
     * 批量删除
     * 
     * @param ids 要删除的ID列表
     * @return 删除的数量
     */
    int deleteByIds(List<Long> ids);
    
    /**
     * 删除所有满足条件的数据
     * 
     * @param condition 删除条件
     * @return 删除的数量
     */
    int deleteByCondition(Predicate<T> condition);
    
    /**
     * 清空所有数据
     */
    void deleteAll();
    
    /**
     * 根据ID查找数据
     * 
     * @param id 数据ID
     * @return 查找到的数据，如果不存在则返回empty
     */
    Optional<T> findById(Long id);
    
    /**
     * 查找所有数据
     * 
     * @return 所有数据列表
     */
    List<T> findAll();
    
    /**
     * 根据条件查找数据
     * 
     * @param condition 查询条件
     * @return 满足条件的数据列表
     */
    List<T> findByCondition(Predicate<T> condition);
    
    /**
     * 根据条件查找第一个数据
     * 
     * @param condition 查询条件
     * @return 第一个满足条件的数据，如果不存在则返回empty
     */
    Optional<T> findFirstByCondition(Predicate<T> condition);
    
    /**
     * 分页查询所有数据 - 推荐使用Pager
     * 
     * @param pager 分页参数对象
     * @return 分页结果
     */
    Pager<T> findAll(Pager<T> pager);
    
    /**
     * 分页条件查询 - 推荐使用Pager
     * 
     * @param condition 查询条件
     * @param pager 分页参数对象
     * @return 分页结果
     */
    Pager<T> findByCondition(Predicate<T> condition, Pager<T> pager);

    /**
     * 统计总数
     * 
     * @return 总记录数
     */
    long count();
    
    /**
     * 统计满足条件的数据数量
     * 
     * @param condition 查询条件
     * @return 满足条件的记录数
     */
    long countByCondition(Predicate<T> condition);
    
    /**
     * 判断是否存在指定ID的数据
     * 
     * @param id 数据ID
     * @return 是否存在
     */
    boolean existsById(Long id);
    
    /**
     * 判断是否存在满足条件的数据
     * 
     * @param condition 查询条件
     * @return 是否存在
     */
    boolean existsByCondition(Predicate<T> condition);

    //void load(List<T> entities);
} 